# 需求: 有一个全局变量num1 = 1 我们需要再函数体内部将其修改为 100

# 创建一个全局变量
num1 = 1


# 创建一个函数
def func1():
    # 修改全局变量的值
    num1 = 100
    # 查看修改结果
    print(num1)  # 100


func1()

# 在函数体外再次打印全局变量
print(num1)  # 1

# 问题: 我们在函数体内修改了全局变量num1的值为100,但是在函数体外调用num1时,值依然没有发生变化.
# 答案: 其实在函数体内部我们并没有修改全局变量,而是创建了一个名字叫num1的局部变量
# 在函数体内,调用num1时,优先调用局部变量,如果局部变量中没有num1, 才会去全局变量中查找

print('----------------------')


# 如果想要在函数体内修改全局变量的值,就要先声明该变量为全局变量

def func2():
    # 先声明该变量为全局变量
    global num1
    # 将全局变量num1 修改为100
    num1 = 100
    print(num1)  # 100


func2()

# 修改完成后,在函数体外打印该全局变量的值
print(num1)  # 100

# 此时就修改成功了

print('--------------------------------')
# 需求:在函数体内,使用复合赋值运算符,让全局变量自增1
def func3():
    # 如果想要自增需要先声明num1为全局变量
    global num1
    # UnboundLocalError: local variable 'num1' referenced before assignment
    # 因为num1 += 1 等价于 num1 = num1 + 1 此时我们num1= 被检索到,系统认为其有局部变量,优先使用局部变量,但是+1时局部变量还没有赋值,所以报错
    num1 += 1
    print(num1)

func3()

print(num1)

print('----------------------')

# 注意: 局部变量和全局变量哪怕名称相同也不是同一个变量,同一个函数体内要么使用全局变量要么使用局部变量,不能同时出现

def func4():
    # 声明全局变量,并自增, global声明后函数体内使用的所有该名称变量,都是全局变量
    global  num1
    num1 += 1

    # 再创建一个同名的局部变量
    num1 = 12
    print(num1)

func4()

print(num1)


# def func5():
#     # 再创建一个同名的局部变量
#     num1 = 21
#     print(num1)
#     # global关键字必须放在变量使用之前
#     # SyntaxError: name 'num1' is used prior to global declaration
#     # 声明全局变量,并自增, global声明后函数体内使用的所有该名称变量,都是全局变量
#     global  num1
#     num1 += 1
#
#
#
# func5()
#
# print(num1)

# 总结:
# 1. 在函数体内使用变量时,优先使用局部变量,如果局部变量不存在,则查找全局变量
# 2. 如果想再函数体内修改全局变量的值,需要先试用global进行声明
# 3. 在函数体内必须先声明global再使用变量,否则报错
# 4. 在一个函数体内不可能出现同名的全局变量和局部变量,只能出现其中一个.
